package persistencia.DAOs;

import java.sql.ResultSet;
import java.sql.SQLException;

import persistencia.AccesoBD;
import persistencia.DataParametros;
import persistencia.EnumTipoParam;
import persistencia.PersistenciaException;

import logica.datatypes.DataAsalariado;
import logica.datatypes.DataEmpleado;
import logica.datatypes.DataFreelance;

//
//
//
//  @ Archivo : DAO EMPLEADOS.java
//  @ Fecha : 03/12/2010
//  @ Author : IUASP
//
//


public class DAOEmpleadosMySQL implements IDAOEmpleados{
	private int rut;
	public DAOEmpleadosMySQL(int rut) {
		
	}
	
	public DAOEmpleadosMySQL() {
		
	}
	
	public void agregar(DataEmpleado dataEmpleado) throws SQLException, ClassNotFoundException, PersistenciaException {
		AccesoBD con = AccesoBD.getInstance();
		DataParametros param[] = new DataParametros[5], param2[] = null;
		param[0] = new DataParametros(EnumTipoParam.INT, dataEmpleado.getCi());
		param[1] = new DataParametros(EnumTipoParam.STRING, dataEmpleado.getNombre());
		param[2] = new DataParametros(EnumTipoParam.STRING, dataEmpleado.getApellido());
		param[3] = new DataParametros(EnumTipoParam.INT, dataEmpleado.getEdad());
		param[4] = new DataParametros(EnumTipoParam.INT, dataEmpleado.getRutEmpresa());
		con.abrirCon();
		con.excecUpdate("INSERT INTO empleados (CI,Nombre,Apellido,Edad,RUT) VALUES (?,?,?,?,?)",param);		
		if (dataEmpleado instanceof DataAsalariado){
			param2 = new DataParametros[2];
			param2[0] = new DataParametros(EnumTipoParam.INT, ((DataAsalariado) dataEmpleado).getCi());
			param2[1] = new DataParametros(EnumTipoParam.FLOAT, ((DataAsalariado) dataEmpleado).getSalario());
			con.excecUpdate("INSERT INTO empasalariados (CI,Salario) VALUES (?,?)",param2);
		}
		
		if (dataEmpleado instanceof DataFreelance){
			param2 = new DataParametros[3];
			param2[0] = new DataParametros(EnumTipoParam.INT, ((DataFreelance) dataEmpleado).getCi());
			param2[1] = new DataParametros(EnumTipoParam.INT, ((DataFreelance) dataEmpleado).getCantidad_horas());
			param2[2] = new DataParametros(EnumTipoParam.FLOAT, ((DataFreelance) dataEmpleado).getPrecio());
			con.excecUpdate("INSERT INTO empfreelance (CI,CantidadHoras,Precio) VALUES (?,?,?)",param2);
		}
		con.cerrarCon();
	}
	
	public boolean existeEmpleado(int ci) throws PersistenciaException, SQLException, ClassNotFoundException {
		DataParametros param[] = new DataParametros[1];
		AccesoBD con = AccesoBD.getInstance();
		con.abrirCon();
		
		param[0] = new DataParametros(EnumTipoParam.INT, ci);
		ResultSet rs = con.execQuery("Select CI from empleados where CI = ?", param);
		boolean existe = false;
		while(!existe && rs.next())
		{
			existe = true;
		} 
		con.cerrarCon();
		return existe;	
	}
	
	public DataEmpleado obtenerEmpleado(int ci) throws PersistenciaException, SQLException, ClassNotFoundException {
		DataParametros param[] = new DataParametros[1];
		DataEmpleado result;
		AccesoBD con = AccesoBD.getInstance();
		con.abrirCon();
		param[0] = new DataParametros(EnumTipoParam.INT, ci);
		ResultSet rs = con.execQuery("Select e.CI, e.Nombre, e.Apellido, e.Edad, e.RUT, f.CantidadHoras, f.Precio, a.Salario " +
				"from empleados e left outer join empfreelance f on e.ci = f.ci left join empasalariados a " +
				"on e.ci = a.ci where e.CI = ?", param);
		rs.first();	
		if (rs.getObject("CantidadHoras") != null && !rs.wasNull()) 
			result = new DataFreelance(rs.getInt("CI"),rs.getString("Nombre").trim(),rs.getString("Apellido").trim(),rs.getInt("Edad"),rs.getInt("RUT"), rs.getInt("CantidadHoras"),rs.getFloat("Precio"));
		else
			result = new DataAsalariado(rs.getInt("CI"),rs.getString("Nombre").trim(),rs.getString("Apellido").trim(),rs.getInt("Edad"),rs.getInt("RUT"),rs.getFloat("Salario"));
		con.cerrarCon();
		return result;	
	}
	
	public void borrarEmpleado(int ci) throws PersistenciaException, SQLException, ClassNotFoundException {
		DataParametros param[] = new DataParametros[1];
		DataEmpleado dataEmp = obtenerEmpleado(ci);
		AccesoBD con = AccesoBD.getInstance();
		con.abrirCon();
		param[0] = new DataParametros(EnumTipoParam.INT, ci);
		
		if (dataEmp instanceof DataAsalariado)
			con.excecUpdate("Delete from empasalariados where CI=?", param);
		
		if (dataEmp instanceof DataFreelance)
			con.excecUpdate("Delete from empfreelance where CI=?", param);
		
		con.excecUpdate("Delete from empleados where CI=?", param);
		con.cerrarCon();
	}
	
	public void modificarEmpleado(DataEmpleado dataEmpleado) throws SQLException, PersistenciaException, ClassNotFoundException {
		AccesoBD con = AccesoBD.getInstance();
		DataParametros param[] = new DataParametros[5], param2[] = null;
		param[0] = new DataParametros(EnumTipoParam.STRING, dataEmpleado.getNombre());
		param[1] = new DataParametros(EnumTipoParam.STRING, dataEmpleado.getApellido());
		param[2] = new DataParametros(EnumTipoParam.INT, dataEmpleado.getEdad());
		param[3] = new DataParametros(EnumTipoParam.INT, dataEmpleado.getRutEmpresa());
		param[4] = new DataParametros(EnumTipoParam.INT, dataEmpleado.getCi());
		con.abrirCon();
				
		if (dataEmpleado instanceof DataAsalariado){
			param2 = new DataParametros[2];			
			param2[0] = new DataParametros(EnumTipoParam.FLOAT, ((DataAsalariado) dataEmpleado).getSalario());
			param2[1] = new DataParametros(EnumTipoParam.INT, ((DataAsalariado) dataEmpleado).getCi());
			con.excecUpdate("UPDATE empasalariados SET Salario=? WHERE CI=?",param2);
		}
		
		if (dataEmpleado instanceof DataFreelance){
			param2 = new DataParametros[3];			
			param2[0] = new DataParametros(EnumTipoParam.INT, ((DataFreelance) dataEmpleado).getCantidad_horas());
			param2[1] = new DataParametros(EnumTipoParam.FLOAT, ((DataFreelance) dataEmpleado).getPrecio());
			param2[2] = new DataParametros(EnumTipoParam.INT, ((DataFreelance) dataEmpleado).getCi());
			con.excecUpdate("UPDATE empfreelance SET CantidadHoras=?, Precio=? WHERE CI=?",param2);
		}
		con.excecUpdate("UPDATE empleados set Nombre=?, Apellido=?, Edad=?, RUT=? WHERE CI =? ",param);
		con.cerrarCon();
	}
	
	
	public DataEmpleado[] listadoEmpleadosEmpresa(int rut) throws PersistenciaException, SQLException, ClassNotFoundException {

		DataParametros param[] = new DataParametros[1];
		AccesoBD con = AccesoBD.getInstance();
		con.abrirCon();
		
		param[0] = new DataParametros(EnumTipoParam.INT, rut);
		
		ResultSet rs = con.execQuery("Select e.CI, e.Nombre, e.Apellido, e.Edad, e.RUT, f.CantidadHoras, f.Precio, a.Salario " +
				"from empleados e left outer join empfreelance f on e.ci = f.ci left join empasalariados a " +
				"on e.ci = a.ci where RUT = ?",param);
		

		int cantEmpleados = con.cantTuplas(rs);
		DataEmpleado[] dataEmpleados = new DataEmpleado[cantEmpleados];
		
		int i=0;
		while(rs.next() && i < cantEmpleados){		
			if (rs.getObject("CantidadHoras") != null && !rs.wasNull()) 
				dataEmpleados[i] = new DataFreelance(rs.getInt("CI"),rs.getString("Nombre").trim(),rs.getString("Apellido").trim(),rs.getInt("Edad"),rs.getInt("RUT"), rs.getInt("CantidadHoras"),rs.getFloat("Precio"));
			else
				dataEmpleados[i] = new DataAsalariado(rs.getInt("CI"),rs.getString("Nombre").trim(),rs.getString("Apellido").trim(),rs.getInt("Edad"),rs.getInt("RUT"),rs.getFloat("Salario"));
			i++;
		}
		con.cerrarCon();
		return dataEmpleados;
	}
	
	public DataEmpleado[] listadoEmpleados() throws PersistenciaException, SQLException, ClassNotFoundException{
		AccesoBD con = AccesoBD.getInstance();
		con.abrirCon();
		
		
		ResultSet rs = con.execQuery("Select e.CI, e.Nombre, e.Apellido, e.Edad, e.RUT, f.CantidadHoras, f.Precio, a.Salario " +
				"from empleados e left outer join empfreelance f on e.ci = f.ci left join empasalariados a " +
				"on e.ci = a.ci");
		

		int cantEmpleados = con.cantTuplas(rs);
		DataEmpleado[] dataEmpleados = new DataEmpleado[cantEmpleados];
		
		int i=0;
		while(rs.next() && i < cantEmpleados){		
			if (rs.getObject("CantidadHoras") != null && !rs.wasNull()) 
				dataEmpleados[i] = new DataFreelance(rs.getInt("CI"),rs.getString("Nombre").trim(),rs.getString("Apellido").trim(),rs.getInt("Edad"),rs.getInt("RUT"), rs.getInt("CantidadHoras"),rs.getFloat("Precio"));
			else
				dataEmpleados[i] = new DataAsalariado(rs.getInt("CI"),rs.getString("Nombre").trim(),rs.getString("Apellido").trim(),rs.getInt("Edad"),rs.getInt("RUT"),rs.getFloat("Salario"));
			i++;
		}
		con.cerrarCon();
		return dataEmpleados;
	};
	
}
